﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Systemet.Views
{
    public partial class Kostnadsrapporter : UserControl
    {
        private DataTable dT;
        private DataTable dtSum;
        private Domain.ProdukController pC;
        private Domain.AktivitetsController aC;
        private Domain.RapportController rC;
        private Domain.KostnadsBudgController kBC;
        private List<Personal> staffList;
        private List<ResursAllokeringar> prodAllocations;
        private IEnumerable<Personalavdelning> staffAllocations;
        private IEnumerable<Aktivietetsregister> activities;
        private List<AktivitetsAllokeringar> activityAllocations;
        private IEnumerable<Produktregister> products;
        private List<ProduktKostnad> productCosts;
        private List<AktivitetsKostnad> ActivityCosts;
        private string currentDepartment;
        private const int personnummerColumndID = 0;
        private const int personalNamnColumndID = 1;

        public Kostnadsrapporter()
        {
            rC = new Domain.RapportController();
            kBC = new Domain.KostnadsBudgController();
            InitializeComponent();
            AccessController.Instance.MainView = this;
            groupBoxLåsBudget.Enabled = AccessController.Instance.UserRoleLoggedInUser.KostnadsrapporterLåsBudget;

        }

        private void buttonLåsKostBudget_Click(object sender, EventArgs e)
        {
            bool successfull = false;
            bool continueLock = false;

            List<ResursAllokeringar> resursallo = new List<ResursAllokeringar>(kBC.ReturnResursAllo());
            List<AktivitetsAllokeringar> aktivitetallo = new List<AktivitetsAllokeringar>(kBC.ReturnAktivitetsAllo());
            Dictionary<string, string> persDispo = new Dictionary<string, string>(kBC.reteurnDisponibelt());

            if (resursallo.Count > 0 || aktivitetallo.Count > 0)
            {
                List<string> temp = new List<string>();
                temp.Add("Följande personal för detta året har disponibelt kvar att resursallokera:\n");

                if (persDispo.Count > 0)
                {
                    foreach (KeyValuePair<string, string> key in persDispo)
                    {
                        temp.Add("Personnummer: " + key.Key + " Disponibelt: " + key.Value);
                    }
                }

                var message = string.Join(Environment.NewLine, temp.ToArray());

                DialogResult dialogResult = MessageBox.Show(message, "Disponibelt kvar att resursallokera", MessageBoxButtons.YesNo);

                if (dialogResult == DialogResult.Yes)
                {
                    if (rC.LockKostnadsBudgets())
                    {
                        MessageBox.Show("Direkta kostnader, kostnadskonton och resursallokeringar är låsta.");
                    }
                }
            }
            else
            {
                MessageBox.Show("Det finns inga olåsta kostnadsbudgeteringar i systemet.");
            }
        }


        public void UpdateReportDGV(DataTable dt)
        {
            dGVKostnRapp.DataSource = dt;
            dGVKostnRapp.Columns[personnummerColumndID].Frozen = true;
            dGVKostnRapp.Columns[personalNamnColumndID].Frozen = true;
        }
        public void ClearReportDGV()
        {
            if (this.dGVKostnRapp.DataSource != null)
            {
                this.dGVKostnRapp.DataSource = null;
            }
            else
            {
                this.dGVKostnRapp.Rows.Clear();
            }

        }
        //Skapa datatable med Produkter
        public void createDatatableProducts(string avd, List<Personal> staff, List<Personalavdelning> staffAllos, List<ResursAllokeringar> prodAllos)
        {
            currentDepartment = avd;
            staffList = staff;
            staffAllocations = staffAllos;
            prodAllocations = prodAllos;
            InsertIntoDTYearlyWorkers();
        }
        //Skapa datatable med aktiviteter
        public void createDatatableActivities(string avd, List<Personal> staff, List<Personalavdelning> staffAllos, List<AktivitetsAllokeringar> activAllos, IEnumerable<Aktivietetsregister> activ)
        {
            currentDepartment = avd;
            staffList = staff;
            staffAllocations = staffAllos;
            activityAllocations = activAllos;
            activities = activ;
            InsertIntoDTYearlyWorkers();
        }
        //Start skapa datatable för direktakostnader på produkter i reportvy
        public void createDataTableDirectcostProducts(string avd, IEnumerable<Produktregister> prodlist, List<ProduktKostnad> prodCosts)
        {
            currentDepartment = avd;
            products = prodlist;
            productCosts = prodCosts;
            InsertIntoDirectCostDT();
        }
        //Start skapa datatable för direktakostnader på Aktiviteter i reportvy
        public void createDataTableDirectcostActivities(string avd, IEnumerable<Aktivietetsregister> activ, List<AktivitetsKostnad> ActivCosts)
        {
            currentDepartment = avd;
            ActivityCosts = ActivCosts;
            activities = activ;
            InsertIntoDirectCostDT();
        }
        private void InsertIntoDTYearlyWorkers()
        {
            dT = new DataTable();
            dT.Columns.Add(new DataColumn("Personnummer", typeof(string)));
            dT.Columns.Add(new DataColumn("Namn", typeof(string)));
            dT.Columns.Add(new DataColumn("Årslön", typeof(string)));
            dT.Columns.Add(new DataColumn("Avd Allokering", typeof(string)));
            dtSum = new DataTable();
            dtSum.Columns.Add(new DataColumn("Personnummer", typeof(string)));
            dtSum.Columns.Add(new DataColumn("Namn", typeof(string)));
            dtSum.Columns.Add(new DataColumn("Årslön", typeof(string)));
            dtSum.Columns.Add(new DataColumn("Avd Allokering", typeof(string)));
            Dictionary<string, double> Summeringar = new Dictionary<string, double>();

            foreach (Personal p in staffList)
            {
                foreach (Personalavdelning pA in staffAllocations)
                {
                    if (pA.personnummer == p.Personnummer)
                    {
                        dT.Rows.Add(p.Personnummer, p.Förnamn + " " + p.Efternamn, (int.Parse(p.Månadslön) * 12).ToString(), pA.procentsats.ToString() + "%");
                    }
                }
            }

            if (currentDepartment.Contains("Drift") || currentDepartment.Contains("Förv"))
            {
                pC = new Domain.ProdukController();
                IEnumerable<Produktregister> products = pC.Produktlista;
                List<ResursAllokeringar> ra = new List<ResursAllokeringar>(kBC.ReturnResursAllo());
                foreach (Produktregister p in products)
                {
                    foreach (ResursAllokeringar r in ra)
                    {
                        if (p.produktID.TrimEnd() == r.ProduktID.TrimEnd())
                        {
                            if (p.avdelningsnamn.Contains(currentDepartment) & r.ProcentSats > 0)
                            {
                                dT.Columns.Add(new DataColumn(p.produkt, typeof(string)));
                                dtSum.Columns.Add(new DataColumn(p.produkt, typeof(string)));
                                Summeringar.Add(p.produkt, 0);
                            }
                        }
                    }
                }

                addProductAllocationCosts(dT, Summeringar);
                UpdateReportDGV(dT);
                CreateSumDataTableYearlyWorker(Summeringar);
            }

            if (currentDepartment.Contains("Adm") || currentDepartment.Contains("mark"))
            {
                List<AktivitetsAllokeringar> aa = new List<AktivitetsAllokeringar>(kBC.ReturnAktivitetsAllo());
                foreach (Aktivietetsregister a in activities)
                {
                    foreach (AktivitetsAllokeringar allo in aa)
                    {
                        if (a.aktivitetsID == allo.AktivitetsID & allo.Procentsats > 0)
                        {
                            if (a.avdelningsnamn.Contains(currentDepartment))
                            {
                                dT.Columns.Add(new DataColumn(a.aktivitet, typeof(string)));
                                dtSum.Columns.Add(new DataColumn(a.aktivitet, typeof(string)));
                                Summeringar.Add(a.aktivitet, 0);
                            }
                        }
                    }
                }

                addActivityAllocationCosts(dT, Summeringar);
                UpdateReportDGV(dT);
                CreateSumDataTableYearlyWorker(Summeringar);
            }
        }


        private void addActivityAllocationCosts(DataTable dt, Dictionary<string, double> sum)
        {
            foreach (DataRow dR in dT.Rows)
            {
                foreach (DataColumn dC in dt.Columns)
                {
                    foreach (Personal p in staffList)
                    {
                        if (dR[dC].ToString() == p.Personnummer)
                        {
                            foreach (AktivitetsAllokeringar aA in activityAllocations)
                            {
                                if (p.Personnummer == aA.PersNr)
                                {
                                    string colName = aA.Aktivitet;
                                    if (dR.Table.Columns[colName] != null)
                                    {
                                        dR[colName] = (aA.Procentsats * 0.01) * (int.Parse(p.Månadslön) * 12);
                                        sum[colName] += (double)((aA.Procentsats * 0.01) * double.Parse(p.Månadslön) * 12);
                                    }


                                }
                            }


                        }
                    }
                }

            }

        }



        private void addProductAllocationCosts(DataTable dt, Dictionary<string, double> sum)
        {
            foreach (DataRow dR in dT.Rows)
            {
                foreach (DataColumn dC in dt.Columns)
                {
                    foreach (Personal p in staffList)
                    {
                        if (dR[dC].ToString() == p.Personnummer)
                        {
                            foreach (ResursAllokeringar rA in prodAllocations)
                            {
                                if (p.Personnummer == rA.PersNr)
                                {
                                    string colName = rA.Produkt;
                                    if (dR.Table.Columns[colName] != null)
                                    {
                                        dR[colName] = (rA.ProcentSats * 0.01) * (int.Parse(p.Månadslön) * 12);
                                        sum[colName] += (double)((rA.ProcentSats * 0.01) * double.Parse(p.Månadslön) * 12);
                                    }
                                }
                            }
                        }
                    }
                }

            }


        }
        /// <summary>
        /// Skapar ett datatable som ska användas som datasource för datagridviewn, baserat
        /// på vilken avdelning som valts i sidmenyn filtreras det på produkter alt aktiviter och 
        /// skapar dataRows i DataTable
        /// </summary>
        private void InsertIntoDirectCostDT()
        {
            dT = new DataTable();
            if (currentDepartment.Contains("Drift") || currentDepartment.Contains("Förv"))
            {
                dT.Columns.Add(new DataColumn("ProduktID", typeof(string)));
                dT.Columns.Add(new DataColumn("Produkt", typeof(string)));
                dT.Columns.Add(new DataColumn("Total belopp", typeof(string)));
                foreach (Produktregister p in products)
                {
                    int total = 0;
                    foreach (ProduktKostnad pK in productCosts)
                    {
                        if (p.produktID.TrimEnd() == pK.ProduktID.TrimEnd())
                        {
                            total += (int)pK.Belopp;
                        }

                    }
                    dT.Rows.Add(p.produktID, p.produkt, total.ToString());
                }
                UpdateReportDGV(dT);
                CreateSumDataTableDirectCost();
            }
            if (currentDepartment.Contains("Adm") || currentDepartment.Contains("mark"))
            {
                dT.Columns.Add(new DataColumn("AktivitetsID", typeof(string)));
                dT.Columns.Add(new DataColumn("Aktivitet", typeof(string)));
                dT.Columns.Add(new DataColumn("Total belopp", typeof(string)));
                foreach (Aktivietetsregister a in activities)
                {
                    int total = 0;
                    foreach (AktivitetsKostnad aK in ActivityCosts)
                    {
                        if (a.aktivitetsID.TrimEnd() == aK.AktivitetsID.TrimEnd())
                        {
                            total += (int)aK.Belopp;
                        }

                    }
                    dT.Rows.Add(a.aktivitetsID, a.aktivitet, total.ToString());
                }
                UpdateReportDGV(dT);
                CreateSumDataTableDirectCost();
            }
        }

        private void CreateSumDataTableDirectCost()
        {
            dtSum = new DataTable();
            dtSum.Columns.Add(new DataColumn("Total", typeof(string)));
            dtSum.Columns.Add(new DataColumn("Total belopp", typeof(string)));
            DataRow row = dtSum.NewRow();
            int tot = 0;
            foreach (DataColumn dC in dT.Columns)
            {
                foreach (DataRow dR in dT.Rows)
                {
                    if (dC.ToString() == "Total belopp")
                    {
                        tot += int.Parse(dR[dC].ToString());
                    }
                }


            }
            row[1] = tot.ToString();
            dtSum.Rows.Add(row);
            dgvSUM.DataSource = dtSum;
            dgvSUM.Columns[0].Width = dGVKostnRapp.Columns[0].Width + dGVKostnRapp.Columns[1].Width;
            dgvSUM.Rows[0].Cells[0].Value = "Total Belopp";
            dgvSUM.Columns[1].Width = dGVKostnRapp.Columns[2].Width;
            dgvSUM.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
            dgvSUM.Refresh();
            dgvSUM.ClearSelection();
            dgvSUM.CurrentCell = null;
        }
        //Summeringstabell för Årsarbetare på aktiviteter/Produkter
        private void CreateSumDataTableYearlyWorker(Dictionary<string, double> sumDict)
        {
            DataRow dr = dtSum.NewRow();

            foreach (KeyValuePair<string, double> key in sumDict)
            {
                string k = key.Key;
                double val = key.Value;

                dr[k] = val.ToString();

            }
            dtSum.Rows.Add(dr);
            dgvSUM.DataSource = dtSum;
            dgvSUM.Columns[0].Width = dGVKostnRapp.Columns[0].Width + dGVKostnRapp.Columns[1].Width + dGVKostnRapp.Columns[2].Width + dGVKostnRapp.Columns[3].Width;
            dgvSUM.Columns[0].Frozen = true;
            dgvSUM.Columns[1].Visible = false;
            dgvSUM.Columns[2].Visible = false;
            dgvSUM.Columns[3].Visible = false;
            dgvSUM.Rows[0].Cells[0].Value = "Total belopp";
            for (int i = 3; i < dgvSUM.Columns.Count; i++)
            {
                dgvSUM.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
            }
            dgvSUM.Refresh();
            dgvSUM.ClearSelection();
            dgvSUM.CurrentCell = null;

        }

        private void dGVKostnRapp_Scroll(object sender, ScrollEventArgs e)
        {
            if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll)
            {
                dgvSUM.HorizontalScrollingOffset = dGVKostnRapp.HorizontalScrollingOffset;
            }
        }



    }
}
